package com.nowcoder.community.util;

/**
 * @BelongsProject: community
 * @BelongsPackage: com.nowcoder.community.util
 * @Author: Master_XXJS
 * @CreateTime: 2023-01-04  10:10
 * @Description: TODO
 * @Version: 1.0
 */
public class RedisKeyUtil {

    private static final String SPLIT = ":";
    private static final String PREFIX_ENTITY_LIKE = "like:entity";
    private static final String PREFIX_USER_LIKE = "like:user";
    private static final String PREFIX_FOLLOWER = "follower";
    private static final String PREFIX_FOLLOWEE = "followee";
    private static final String PREFIX_KAPTCHA = "kaptcha";
    private static final String PREFIX_TICKET = "ticket";
    private static final String PREFIX_USER = "user";
    private static final String PREFIX_UV = "uv";
    private static final String PREFIX_DAU = "dau";
    private static final String PREFIX_POST = "post";

    // 实体：帖子，评论，回复
    //like:entity:entityType:entityId -> set(userId),使用 set 集合，因为需要 存放用户的id，方便知道是谁的点赞
    //不能单纯的使用 String或者集合记录 一个点赞的数字而已
    //set集合存放了多少个 用户的id，就是多少个点赞
    /**
     *  某一个实体的赞的 key
     * @param entityType 实体的类型
     * @param entityId 实体的id
     * @return
     */
    public static String getEntityLikeKey(int entityType, int entityId){
        return PREFIX_ENTITY_LIKE + SPLIT + entityType + entityId;
    }

    /**
     * 收到某一个用户的赞
     * like:user:userId -> int，存放 int 类型的数据就行
     * @param userId 被点赞的用户
     * @return
     */
    public static String getUserLikeKey(int userId){
        return PREFIX_USER_LIKE + SPLIT + userId;
    }

    /**
     * 用户关注的实体
     * followee:userId:entityType  --> zset(entityId,now) 有序集合，根据时间是什么时候关注的
     * @param userId 用户的id
     * @param entityType 实体的类型。用户，帖子，题目
     * @return
     */
    public static String getFolloweeKey(int userId,int entityType){
        return PREFIX_FOLLOWEE + SPLIT + userId + SPLIT + entityType;
    }

    /**
     * 实体拥有的粉丝
     * follower:entityType:entityId  -->  zset(userId,now)  有序集合，什么时候的粉丝
     * @param entityType 实体的类型
     * @param entityId 实体的id
     * @return
     */
    public static String getFollowerKey(int entityType,int entityId){
        return PREFIX_FOLLOWER + SPLIT + entityType + SPLIT + entityId;
    }

    /**
     * 验证码
     * @param owner cookie携带的参数，用来获取 redis的验证码
     * @return
     */
    public static String getKaptchaKey(String owner){
        return PREFIX_KAPTCHA + SPLIT + owner;
    }

    /**
     * 登录的凭证的 key
     * @param ticket 登录凭证key
     * @return
     */
    public static String getTicketKey(String ticket){
        return PREFIX_TICKET + SPLIT + ticket;
    }

    /**
     * 用户的信息
     * @param userId 当前的登录的用户
     * @return
     */
    public static String getUserKey(int userId){
        return PREFIX_TICKET + SPLIT + userId;
    }

    /**
     * 日独立用户UV的访问量，存储用户ip
     * @param date 日期
     * @return
     */
    public static String getUVKey(String date){
        return PREFIX_UV + SPLIT + date;
    }

    /**
     * 区间独立用户UV的访问量
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return
     */
    public static String getUVKey(String startDate, String endDate){
        return PREFIX_UV + SPLIT + startDate + SPLIT + endDate;
    }

    // 单日活跃用户DAU,存储用户id
    public static String getDAUKey(String date) {
        return PREFIX_DAU + SPLIT + date;
    }

    // 区间活跃用户DAU
    public static String getDAUKey(String startDate, String endDate) {
        return PREFIX_DAU + SPLIT + startDate + SPLIT + endDate;
    }

    // 帖子分数，不需要传递参数了，因为发声变化的是 多个帖子，不是单个帖子
    public static String getPostKey() {
        return PREFIX_POST + SPLIT + "score";
    }

}

